package difficult.array;

/**
 * <a href="https://leetcode.cn/problems/median-of-two-sorted-arrays/description/">4. 寻找两个正序数组的中位数</a>
 * 给定两个大小分别为 m 和 n 的正序（从小到大）数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
 * 算法的时间复杂度应该为 O(log (m+n)) 。
 * 示例 1：
 *   输入：nums1 = [1,3], nums2 = [2]
 *   输出：2.00000
 *   解释：合并数组 = [1,2,3] ，中位数 2
 * 示例 2：
 *   输入：nums1 = [1,2], nums2 = [3,4]
 *   输出：2.50000
 *   解释：合并数组 = [1,2,3,4] ，中位数 (2 + 3) / 2 = 2.5
 * 提示：
 *   nums1.length == m
 *   nums2.length == n
 *   0 <= m <= 1000
 *   0 <= n <= 1000
 *   1 <= m + n <= 2000
 *   -10^6 <= nums1[i], nums2[i] <= 10^6
 * @author 刘学松
 * @date 2025-04-23 9:39
 */
public class 寻找两个正序数组的中位数 {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length, len2 = nums2.length, len3 = len1+len2;
        int cur = 0;
        int index1 = 0, index2 = 0;
        int mid = len3 >> 1;
        while (index1 < len1 && index2 < len2) {
            if (nums1[index1] < nums2[index2]) {
                cur = nums1[index1];
                index1++;
            } else {
                cur = nums2[index2];
                index2++;
            }
            mid--;
            if (mid == 0) {
                break;
            }
        }
        while (index1 < len1) {
            if (mid == 0) {
                break;
            }
            cur = nums1[index1];
            index1++;
            mid--;
        }
        while (index2 < len2) {
            if (mid == 0) {
                break;
            }
            cur = nums2[index2];
            index2++;
            mid--;
        }
        if ((len3 & 1) == 1) {
            if (index1 < len1 && index2 < len2) {
                return Math.min(nums1[index1], nums2[index2]);
            } else if (index1 < len1) {
                return nums1[index1];
            } else {
                return nums2[index2];
            }
        } else {
            if (index1 < len1 && index2 < len2) {
                cur += Math.min(nums1[index1], nums2[index2]);
            } else if (index1 < len1) {
                cur += nums1[index1];
            } else {
                cur += nums2[index2];
            }
            return (double) cur / 2;
        }
    }
}
